/**
 * @author 徐楠
 * @date 2022/5/1 9:06
 * @version 1.0
 */

package com.xunan.likou;

public class FigureGuessingGame {
    public static void main(String[] args) {

    }

    /**
     * 根据题意，对于公牛，需要满足数字和确切位置都猜对。我们可以遍历 secret 和 guess，
     * 统计满足 secret[i]=guess[i] 的下标个数，即为公牛的个数。
     * <p>
     * 对于奶牛，需要满足数字猜对但是位置不对。我们可以在 secret[i] = guess[i] 时，
     * 分别统计 secret 和 guess 的各个字符的出现次数,
     * 记在两个长度为 1010 的数组中。根据题目所述的「这次猜测中有多少位非公牛数字可以通过重新排列转换成公牛数字」，
     * 由于多余的数字无法匹配，对于0 到 9 的每位数字，应取其在 secret 和 guess 中的出现次数的最小值。
     * 将每位数字出现次数的最小值累加，即为奶牛的个数。
     *
     * @param secret
     * @param guess
     * @return
     */
    public static String getHint(String secret, String guess) {
        int bulls = 0;
        int[] countSecret = new int[10];
        int[] countGuess = new int[10];
        for (int i = 0; i < secret.length(); ++i) {
            if (secret.charAt(i) == guess.charAt(i)) {
                ++bulls;
            } else {
                //secret.charAt(i) - '0' 就会变成真实的1、2、3...
                ++countSecret[secret.charAt(i) - '0'];
                ++countGuess[guess.charAt(i) - '0'];
            }
        }
        //执行完上面循环中的else之后，我就能得到secret和guess中所有不相等记录的信息
        //数组的下标是表示是那个数字，故数组之中记录的是该数字在不相等位置，含有的数量
        //如 countSecret[2] = 3 ,表示在secret.charAt(i) ！= guess.charAt(i)不等的时候2这个数字总计有3个
        int cows = 0;
        for (int i = 0; i < 10; ++i) {
            cows += Math.min(countSecret[i], countGuess[i]);
        }
        return bulls + "A" + cows + "B";
    }

}
